package com.lottemall.user.web;

import com.lottemall.user.pojo.User;
import com.lottemall.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * 用户信息控制层
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 校验数据唯一性
     *
     * @param data 要校验的数据
     * @param type 要校验的数据的类型 1：用户名  2：手机
     * @return
     */
    @GetMapping("/check/{data}/{type}")
    public ResponseEntity<Boolean> checkData(@PathVariable("data") String data, @PathVariable("type") Integer type) {
        return ResponseEntity.ok(userService.checkData(data, type));

    }

    /**
     * 发送短信
     *
     * @param phone
     * @return
     */
    @PostMapping("code")
    public ResponseEntity<Void> sendCode(@RequestParam("phone") String phone) {
        userService.sendCode(phone);
        return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); //204
    }

    /**
     * 用户注册
     *
     * @param user 这个实体的数据需要被校验
     * @param bindingResult 如果紧跟这个，那么springmvc就不帮我 们处理校验失败后的消息返回给客户端，我们需要自己处理（可以使返回结果简洁）
     * @param code
     * @return
     */
    @PostMapping("register")
    public ResponseEntity<Void> register(@Valid User user, BindingResult bindingResult, @RequestParam("code") String code) {
        //如果@Valid校验到了错误信息   （其实我们这里不用处理，因为我们是给前端的，前端有了校验，除非有心人，我们不必为他做的够好，只要有服务端检验就好）
//        if (bindingResult.hasFieldErrors()){
//            //抛出，得到错误消息列表，那么大方式得到 里面的错误消息，转成字符串，并用|分隔
//            throw new RuntimeException(bindingResult.getFieldErrors().stream()
//                    .map(e->e.getDefaultMessage()).collect(Collectors.joining("|")));
//        }
        userService.register(user, code);
        return ResponseEntity.status(HttpStatus.CREATED).build();//CREATED是201，根据接口文档我们需要返回201
    }

    /**
     * 根据用户名和密码查询用户
     * @param username
     * @param password
     * @return
     */
    @GetMapping("query")
    public ResponseEntity<User> queryUserByUsernameAndPassword(
            @RequestParam("username")  String username,
            @RequestParam("password")  String password
    ){
        return ResponseEntity.ok(userService.queryUserByUsernameAndPassword(username,password));
    }
}
